package `02-lambada`

/**
 * 对泛型进行扩展
 *
 * apply、also、run、let函数就是对泛型的扩展。
 *
 * 扩展T类的函数，函数名是show，T可以是任意类。
 * show函数的参数是一个函数，该函数是T类的匿名扩展函数
 *
 * 作用：
 * 同一功能可以针对很多类，返回又可以由调用者自行处理。
 */
fun <T> T.show( t : T.()->Unit){
    //show函数的功能是调用t函数
    //t() == this.t()  this可以省略
    //对T类进行扩展，this==调用者本身
//    t()
    this.t()
}

/**
 * 对泛型进行扩展
 *
 * apply、also、run、let函数就是对泛型的扩展。
 *
 * show02是T的扩展函数，T可以是任意类。
 * show02函数的参数是一个参数，函数的输入是T类型，输出是Unit，不是T的匿名扩展函数。
 * t2不是T的扩展函数，调用的时候不用this，但是t2的参数是T类型，调用的时候需要传入T类型的实例。
 */
fun <T> T.show02(t2:(T)->Unit){
    t2(this)
}

fun main() {
    "A".show {
        //show函数参数t的实现
        //此函数也是T的扩展函数，this = 调用着本身 = "A"
        println(this)
    }

    //T.show02 中的T == 5
    //t2(this) 中的this = it
    5.show02 {
        //t2的实现，t2不是扩展函数，没有this，是lambda函数，因参数只有一个，it代表函数的输入
        println(it)
    }

    1.5f.let{

    }

}